package base.proxy;

import com.itheima.service.UserService;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @program: Spring_day01_01_IOC入门程序
 * @description: JDKProxy代理【没看懂】
 * JDKProxy动态代理是针对对象做代理，要求原始对象具有接口实现，并对接口方法进行增强。
 * @author: xuejingjing
 * @create: 2021-08-04 11:08
 **/
public  class UserServiceJDKProxy {

    //传入一个被代理的对象
    public static UserService createUserServiceJDKProxy(final UserService userService){
        //获得类加载器
        ClassLoader cl = userService.getClass().getClassLoader();
        //获取他的反射和所有的接口。
        Class[] classes = userService.getClass().getInterfaces() ;

        //自定义拦截里面做什么事
        InvocationHandler ih = new InvocationHandler() {

            //代理的对象，拦截的方法，参数
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object ret = method.invoke(userService, args);
                System.out.println("刮大白");
                System.out.println("贴壁纸");
                return ret;
            }
        };

        //这一句应该是核心，理论上就这一句。
        UserService service = (UserService) Proxy.newProxyInstance(cl,classes,ih);
        return  service;
    }
}
